package sv.com.renacempleo.dao.ctg;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import sv.com.renacempleo.dao.BaseDaoImpl;
import sv.com.renacempleo.dto.ctg.CtgOficinas;
import sv.com.renacempleo.exception.WebException;

public class CtgOficinasDaoImpl extends BaseDaoImpl implements CtgOficinasDao{

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllActivesAsArray() throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(CtgOficinas.class);
		criteria.addOrder(Order.asc("ctgOficinaId"));
		criteria.add(Restrictions.eq("ctgOficinaActiva", "1"));
		criteria.createAlias("ctgTipoOficina", "ctgTipoOficina");
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("ctgOficinaId")).
				add(Projections.property("ctgOficinaNombre"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

	@SuppressWarnings("unchecked")
	public List<Object[]> findAllAsArray() throws WebException {
		DetachedCriteria criteria = DetachedCriteria.forClass(CtgOficinas.class);
		criteria.addOrder(Order.asc("ctgOficinaId"));
		criteria.createAlias("ctgMunicipio", "ctgMunicipio");
		criteria.createAlias("ctgMunicipio.ctgDepartamento", "ctgDepartamento");
		criteria.setProjection(Projections.projectionList().
				add(Projections.property("ctgOficinaId")).
				add(Projections.property("ctgOficinaNombre")).
				add(Projections.property("ctgOficinaTelefono")).
				add(Projections.property("ctgOficinaDireccion")).
				add(Projections.property("ctgOficinaResponsable")).
				add(Projections.property("ctgOficinaActiva")).
				add(Projections.property("ctgMunicipio.ctgMunicipioId")).
				add(Projections.property("ctgMunicipio.ctgMunicipioNombre")).
				add(Projections.property("ctgDepartamento.ctgDepartamentoNombre")).
				add(Projections.property("ctgDepartamento.ctgDepartamentoId")).
				add(Projections.property("ctgTipoOficina.ctgCatalogoId")).
				add(Projections.property("ctgTipoOficina.ctgCatalogoNombre"))
		);
		return (List<Object[]>) findByCriteria(criteria);
	}

	@Override
	public void delete(Long ctgOficinaId) throws WebException {
		String hqlQuery = "delete from CtgOficinas where ctgOficinaId = :ctgOficinaId";
		Map<String,Object> parameters = new HashMap<String, Object>();
		parameters.put("ctgOficinaId", parameters);
		executeNonHibernateQuery(hqlQuery, parameters);
	}

	@Override
	public void toggleActive(Long ctgOficinaId, String ctgOficinaActiva)
			throws WebException {
		try{
			String hqlQuery = "update CtgOficinas set ctgOficinaActiva = :ctgOficinaActiva " +
					"where ctgOficinaId = :ctgOficinaId";
			Map<String,Object> parameters = new HashMap<String, Object>();
			parameters.put("ctgOficinaId", ctgOficinaId);
			parameters.put("ctgOficinaActiva", "1".equals(ctgOficinaActiva) ? "0" : "1");
			executeNonHibernateQuery(hqlQuery, parameters);
		} catch (WebException e) {
			throw e;
		} catch (Exception e) {
			throw new WebException("Problemas al actualizar la informaci\u00F3n");
		}
	}

}
